package com.ceo.common.export;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * 导出表格或execl的标题和数据源绑定类,此类用于定义一个表格的标题和标题绑定的数据源的对象属性
 * @author 陈江林
 *
 */
public class TableMapper
{
	private List<TableHeader> tableFields =new ArrayList<TableHeader>();//表格列集合,保存第一级的表头
	private List<TableHeader> dataMappingFields =new ArrayList<TableHeader>();//表格列集合,保存最底层的绑定数据源的表头
	/**
	 * 获取表头最顶层的标题集合
	 * @return
	 */
	public List<TableHeader> getTableFields()
	{
		return tableFields;
	}
	/**
	 * 添加一个最顶层的标题
	 * @param tf
	 */
	public TableMapper addField(TableHeader tf)
	{
		tableFields.add(tf);
		return this;
	}
	/**
	 * 添加一组最顶层的标题
	 * @param tfs
	 */
	public TableMapper addField(List<TableHeader> tfs)
	{
		tableFields.addAll(tfs);
		return this;
	}
	public TableHeader addFiled(String fieldName)
	{
		TableHeader tf=new TableHeader(fieldName);
		tableFields.add(tf);
		return tf;
	}
	public TableHeader addFiled(String fieldKey, String fieldName)
	{
		TableHeader tf=new TableHeader(fieldKey,fieldName);
		tableFields.add(tf);
		return tf;
	}
	/**
	 * 添加一个数据列
	 * @param fieldKey 绑定的属性名
	 * @param fieldName 标题名称
	 * @param columnWidth 标题宽度
	 */
	public TableHeader addFiled(String fieldKey, String fieldName, int columnWidth)
	{
		TableHeader tf=new TableHeader(fieldKey,fieldName,columnWidth);
		tableFields.add(tf);
		return tf;
	}
	public TableHeader addFiled(String fieldKey, String fieldName,DataFormater df)
	{
		TableHeader tf=new TableHeader(fieldKey,fieldName,df);
		tableFields.add(tf);
		return tf;
	}
	/**
	 * 
	 * 添加一个数据列
	 * @param fieldKey 绑定的属性名
	 * @param fieldName 标题名称
	 * @param columnWidth 标题宽度
	 * @param df 自定义的数据格式化类
	 */
	public TableHeader addFiled(String fieldKey, String fieldName, int columnWidth, DataFormater df)
	{
		TableHeader tf=new TableHeader(fieldKey,fieldName,columnWidth,df);
		tableFields.add(tf);
		return tf;
	}

	/**
	 * 获取所有数据列对应的列(底层绑定数据列)标头
	 * @return
	 */
	public List<TableHeader> getdataMapingField()
	{
		dataMappingFields.clear();
		for(TableHeader tf:tableFields)
			searchDataField(tf);
		return dataMappingFields;
	}
	/**
	 * 递归查询知道列包含的最底层的列
	 * @param tf
	 */
	private void searchDataField(TableHeader tf)
	{
		if(tf.getChildFiled()==null)
		{
			dataMappingFields.add(tf);
			return;
		}
		for(TableHeader t:tf.getChildFiled())
		{
			searchDataField(t);
		}
	}
	/**
	 * 获取最大的层级
	 * @return
	 */
	public int getMaxLevel()
	{
		int maxTitleLevel=0;
		for(TableHeader tf:tableFields)
		{
			int num=tf.countRowIndex(0);
			maxTitleLevel=maxTitleLevel<num?num:maxTitleLevel;
		}
		return maxTitleLevel;
	}

	public List<List<String>> convertHeader(){
		int maxLevel=getMaxLevel();
		List<List<String>> easy_headers=new ArrayList<>();
		for(TableHeader th:getdataMapingField()){
			String[] header=new String[maxLevel+1];
			header[maxLevel]=th.getFieldName();
			for(int i=maxLevel-1;i>=0;i--){
				TableHeader pth=th.getParentHeader();
				if(pth!=null&&pth.getLevelIndex()==i){
					header[i]=pth.getFieldName();
					th=pth;
				}else
					header[i]=th.getFieldName();
			}
			easy_headers.add(Arrays.asList(header));
		}
		return easy_headers;
	}

	public List<List<Object>> convertData(List data){
		List<List<Object>> list=new ArrayList<>();
		for(Object object:data){
			List<Object> rowData=new ArrayList<>();
			for(TableHeader th:getdataMapingField()){
				rowData.add(th.getDataValue(object));
			}
			list.add(rowData);
		}
		return list;
	}
}
